#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMouseEvent>
#include <QEvent>
#include <QStringList>
#include <QPushButton>
#include <QTimer>
#include <QTime>
#include <QDebug>
#include <QFont>
#include <QInputDialog>
#include <QLineEdit>
#include <QMessageBox>
#include <QFormLayout>
#include <QLabel>
#include <QDialogButtonBox>
#include <QWidget>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QVBoxLayout>
#include <vector>
#include <iostream>
#include <sstream>
#include <string>
//extern "C" {
#include "sqlite3.h"
//}
using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui { class GameMainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    int row = 8;  // 行 2~20
    int col = 8;  // 列 2~30
    int mines_num = 10;  // 地雷数 1~row*col-1

    int game_state = 0; // 游戏状态 0结束，1正常进行，2暂停
    int debug_mode = 0; // 调试模式 0关闭，1打开

    vector<vector<int>> mines_state;  // 地雷格子状态 -1雷，0-8数
    vector<vector<int>> flags_state;  // 地雷插旗状态 0待点击，1已点击，2已插旗

    int flags_num = 0;  // 已插旗数
    int opened_num = 0;  // 已被点开的格子数

    QTimer *timer = new QTimer(this);  // 定时器
    int secondsElapsed = 0;

    void createMines();  // 创建地雷棋盘
    void clearMines();  //清除地雷棋盘
    void overGame(bool success, int x, int y);  // 游戏结算

    void changeMinesFlags(int x, int y, int flag);  // 修改地雷显示状态
    void dfs(int x, int y);  // 深度优先搜索

    // 地雷按键左击右击回调函数
    void onLeftButtonClick(int x, int y);
    void onRightButtonClick(int x, int y);
    bool eventFilter(QObject *watched, QEvent *event) override;

    //按键回调函数
    void onDebugButtonClick();  //调试按钮
    void onTimeButtonClick();  //暂停按钮
    void updateTimerDisplay();  //更新时间显示
    void onRestartButtonClick();  //重开按钮
    void onSettingButtonClick();  //设置按钮
    void onRankingButtonClick();  //排行榜按钮

    //SQLite相关
    void addRecordToDatabase(const string& name_sq, int row_sq, int col_sq, int mines_sq, int time_sq);


private:
    Ui::GameMainWindow *ui;
};
#endif // MAINWINDOW_H
